<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<meta name="theme-color" content="#222" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#222" media="(prefers-color-scheme: dark)"><meta name="generator" content="Hexo 6.3.0">
<link rel="preconnect" href="https://fonts.googleapis.com" crossorigin>
  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png">
  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png">
  <link rel="mask-icon" href="/images/logo.svg" color="#222">

<link rel="stylesheet" href="/css/main.css">

<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,300italic,400,400italic,700,700italic%7CZCOOL+QingKe+HuangYou:300,300italic,400,400italic,700,700italic%7CNoto+Sans+Simplified+Chinese:300,300italic,400,400italic,700,700italic%7CJetBrains+Mono:300,300italic,400,400italic,700,700italic&display=swap&subset=latin,latin-ext">

<link rel="stylesheet" href="/lib/@fortawesome/fontawesome-free/css/all.min.css" integrity="sha256-HtsXJanqjKTc8vVQjO4YMhiqFoXkfBsjBWcX91T1jr8=" crossorigin="anonymous">
  <link rel="stylesheet" href="/lib/animate.css/animate.min.css" integrity="sha256-PR7ttpcvz8qrF57fur/yAx1qXMFJeJFiA6pSzWi0OIE=" crossorigin="anonymous">
  <link rel="stylesheet" href="/lib/@fancyapps/ui/dist/fancybox/fancybox.css" integrity="sha256-RvRHGSuWAxZpXKV9lLDt2e+rZ+btzn48Wp4ueS3NZKs=" crossorigin="anonymous">

<script class="next-config" data-name="main" type="application/json">{"hostname":"wyatex.online","root":"/","images":"/images","scheme":"Pisces","darkmode":true,"version":"8.18.0","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12},"copycode":{"enable":true,"style":"mac"},"fold":{"enable":false,"height":500},"bookmark":{"enable":false,"color":"#222","save":"auto"},"mediumzoom":false,"lazyload":true,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"stickytabs":false,"motion":{"enable":true,"async":true,"transition":{"menu_item":"fadeInDown","post_block":"fadeIn","post_header":"fadeInDown","post_body":"fadeInDown","coll_header":"fadeInLeft","sidebar":"fadeInUp"}},"prism":false,"i18n":{"placeholder":"搜索...","empty":"没有找到任何搜索结果：${query}","hits_time":"找到 ${hits} 个搜索结果（用时 ${time} 毫秒）","hits":"找到 ${hits} 个搜索结果"},"path":"/search.xml","localsearch":{"enable":true,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":true}}</script><script src="/js/config.js"></script>

    <meta name="description" content="依然是第三章的内容，上一篇整理完了8086指令系统中主要的指令，这次主要讲程序格式和程序结构">
<meta property="og:type" content="article">
<meta property="og:title" content="微机与接口技术笔记（3）">
<meta property="og:url" content="https://wyatex.online/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%BE%AE%E6%9C%BA%E4%B8%8E%E6%8E%A5%E5%8F%A3%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0%EF%BC%883%EF%BC%89/index.html">
<meta property="og:site_name" content="Wyatex&#96;s blog">
<meta property="og:description" content="依然是第三章的内容，上一篇整理完了8086指令系统中主要的指令，这次主要讲程序格式和程序结构">
<meta property="og:locale" content="zh_CN">
<meta property="article:published_time" content="2020-10-29T11:55:03.000Z">
<meta property="article:modified_time" content="2023-05-05T01:25:47.586Z">
<meta property="article:author" content="Wyatex">
<meta property="article:tag" content="学习笔记">
<meta property="article:tag" content="微机">
<meta name="twitter:card" content="summary">


<link rel="canonical" href="https://wyatex.online/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%BE%AE%E6%9C%BA%E4%B8%8E%E6%8E%A5%E5%8F%A3%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0%EF%BC%883%EF%BC%89/">



<script class="next-config" data-name="page" type="application/json">{"sidebar":"","isHome":false,"isPost":true,"lang":"zh-CN","comments":true,"permalink":"https://wyatex.online/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%BE%AE%E6%9C%BA%E4%B8%8E%E6%8E%A5%E5%8F%A3%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0%EF%BC%883%EF%BC%89/","path":"学习笔记/微机与接口技术笔记（3）/","title":"微机与接口技术笔记（3）"}</script>

<script class="next-config" data-name="calendar" type="application/json">""</script>
<title>微机与接口技术笔记（3） | Wyatex`s blog</title>
  








  <noscript>
    <link rel="stylesheet" href="/css/noscript.css">
  </noscript>
</head>

<body itemscope itemtype="http://schema.org/WebPage" class="use-motion">
  <div class="headband"></div>

  <main class="main">
    <div class="column">
      <header class="header" itemscope itemtype="http://schema.org/WPHeader"><div class="site-brand-container">
  <div class="site-nav-toggle">
    <div class="toggle" aria-label="切换导航栏" role="button">
        <span class="toggle-line"></span>
        <span class="toggle-line"></span>
        <span class="toggle-line"></span>
    </div>
  </div>

  <div class="site-meta">

    <a href="/" class="brand" rel="start">
      <i class="logo-line"></i>
      <p class="site-title">Wyatex`s blog</p>
      <i class="logo-line"></i>
    </a>
  </div>

  <div class="site-nav-right">
    <div class="toggle popup-trigger" aria-label="搜索" role="button">
        <i class="fa fa-search fa-fw fa-lg"></i>
    </div>
  </div>
</div>



<nav class="site-nav">
  <ul class="main-menu menu"><li class="menu-item menu-item-home"><a href="/" rel="section"><i class="fa fa-home fa-fw"></i>首页</a></li><li class="menu-item menu-item-about"><a href="/about/" rel="section"><i class="fa fa-user fa-fw"></i>关于</a></li><li class="menu-item menu-item-tags"><a href="/tags/" rel="section"><i class="fa fa-tags fa-fw"></i>标签<span class="badge">97</span></a></li><li class="menu-item menu-item-categories"><a href="/categories/" rel="section"><i class="fa fa-th fa-fw"></i>分类<span class="badge">26</span></a></li><li class="menu-item menu-item-archives"><a href="/archives/" rel="section"><i class="fa fa-archive fa-fw"></i>归档<span class="badge">155</span></a></li><li class="menu-item menu-item-编程"><a href="/programming/" rel="section"><i class="fa fa-book fa-fw"></i>编程</a></li><li class="menu-item menu-item-蹲坑读物"><a href="/%E5%B9%B2%E8%B4%A7/%E5%BC%80%E5%8F%91%E4%BA%A4%E6%B5%81%E7%BE%A4%E5%88%86%E4%BA%AB%E8%AE%B0%E5%BD%95/" rel="section"><i class="fa fa-book fa-fw"></i>蹲坑读物</a></li>
      <li class="menu-item menu-item-search">
        <a role="button" class="popup-trigger"><i class="fa fa-search fa-fw"></i>搜索
        </a>
      </li>
  </ul>
</nav>



  <div class="search-pop-overlay">
    <div class="popup search-popup"><div class="search-header">
  <span class="search-icon">
    <i class="fa fa-search"></i>
  </span>
  <div class="search-input-container">
    <input autocomplete="off" autocapitalize="off" maxlength="80"
           placeholder="搜索..." spellcheck="false"
           type="search" class="search-input">
  </div>
  <span class="popup-btn-close" role="button">
    <i class="fa fa-times-circle"></i>
  </span>
</div>
<div class="search-result-container no-result">
  <div class="search-result-icon">
    <i class="fa fa-spinner fa-pulse fa-5x"></i>
  </div>
</div>

    </div>
  </div>

</header>
        
  
  <aside class="sidebar">

    <div class="sidebar-inner sidebar-nav-active sidebar-toc-active">
      <ul class="sidebar-nav">
        <li class="sidebar-nav-toc">
          文章目录
        </li>
        <li class="sidebar-nav-overview">
          站点概览
        </li>
      </ul>

      <div class="sidebar-panel-container">
        <!--noindex-->
        <div class="post-toc-wrap sidebar-panel">
            <div class="post-toc animated"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E6%A0%BC%E5%BC%8F"><span class="nav-number">1.</span> <span class="nav-text">汇编语言程序格式</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E4%B9%A6%E5%86%99%E6%A0%BC%E5%BC%8F"><span class="nav-number">1.1.</span> <span class="nav-text">汇编语言程序书写格式</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%90%8D%E5%AD%97%E9%A1%B9"><span class="nav-number">1.1.1.</span> <span class="nav-text">名字项</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%93%8D%E4%BD%9C%E7%AC%A6%E9%A1%B9"><span class="nav-number">1.1.2.</span> <span class="nav-text">操作符项</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%93%8D%E4%BD%9C%E6%95%B0%E9%A1%B9"><span class="nav-number">1.1.3.</span> <span class="nav-text">操作数项</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%B3%A8%E9%87%8A%E9%A1%B9"><span class="nav-number">1.1.4.</span> <span class="nav-text">注释项</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E8%A1%A8%E8%BE%BE%E5%BC%8F%E4%B8%8E%E8%BF%90%E7%AE%97%E7%AC%A6"><span class="nav-number">1.2.</span> <span class="nav-text">表达式与运算符</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E4%BC%AA%E6%8C%87%E4%BB%A4%E8%AF%AD%E5%8F%A5"><span class="nav-number">1.3.</span> <span class="nav-text">伪指令语句</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%AE%B5%E5%AE%9A%E4%B9%89%E4%BC%AA%E6%8C%87%E4%BB%A4"><span class="nav-number">1.3.1.</span> <span class="nav-text">段定义伪指令</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#SEGMENT-ENDS%E4%BC%AA%E6%8C%87%E4%BB%A4"><span class="nav-number">1.3.1.1.</span> <span class="nav-text">SEGMENT&#x2F;ENDS伪指令</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#ASSUME%E4%BC%AA%E6%8C%87%E4%BB%A4"><span class="nav-number">1.3.1.2.</span> <span class="nav-text">ASSUME伪指令</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%95%B0%E6%8D%AE%E5%AE%9A%E4%B9%89%E4%BC%AA%E6%8C%87%E4%BB%A4"><span class="nav-number">1.3.2.</span> <span class="nav-text">数据定义伪指令</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#%E5%AE%9A%E4%B9%89%E5%AD%97%E8%8A%82%E5%8F%98%E9%87%8F%E4%BC%AA%E6%8C%87%E4%BB%A4DB"><span class="nav-number">1.3.2.1.</span> <span class="nav-text">定义字节变量伪指令DB</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E5%AE%9A%E4%B9%89%E5%AD%97%E5%8F%98%E9%87%8F%E4%BC%AA%E6%8C%87%E4%BB%A4DW"><span class="nav-number">1.3.2.2.</span> <span class="nav-text">定义字变量伪指令DW</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E5%AE%9A%E4%B9%89%E5%8F%8C%E5%AD%97%E5%8F%98%E9%87%8F%E4%BC%AA%E6%8C%87%E4%BB%A4DD"><span class="nav-number">1.3.2.3.</span> <span class="nav-text">定义双字变量伪指令DD</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E5%AE%9A%E4%B9%89%E5%9B%9B%E5%AD%97%E5%8F%98%E9%87%8F%E4%BC%AA%E6%8C%87%E4%BB%A4DQ"><span class="nav-number">1.3.2.4.</span> <span class="nav-text">定义四字变量伪指令DQ</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E5%AE%9A%E4%B9%89%E5%8D%81%E5%AD%97%E8%8A%82%E5%8F%98%E9%87%8F%E4%BC%AA%E6%8C%87%E4%BB%A4DT"><span class="nav-number">1.3.2.5.</span> <span class="nav-text">定义十字节变量伪指令DT</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#DUP%EF%BC%88duplication-operator%EF%BC%89%E7%94%A8%E4%BA%8E%E9%87%8D%E5%A4%8D%E6%9F%90%E4%B8%AA%EF%BC%88%E6%88%96%E6%9F%90%E4%BA%9B%EF%BC%89%E6%93%8D%E4%BD%9C%E6%95%B0%E3%80%82"><span class="nav-number">1.3.2.6.</span> <span class="nav-text">DUP（duplication operator）用于重复某个（或某些）操作数。</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%AC%A6%E5%8F%B7%E5%AE%9A%E4%B9%89%E4%BC%AA%E6%8C%87%E4%BB%A4"><span class="nav-number">1.3.3.</span> <span class="nav-text">符号定义伪指令</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#EQU%E4%BC%AA%E6%8C%87%E4%BB%A4"><span class="nav-number">1.3.3.1.</span> <span class="nav-text">EQU伪指令</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%EF%BC%88%E7%AD%89%E5%8F%B7%EF%BC%89%E4%BC%AA%E6%8C%87%E4%BB%A4"><span class="nav-number">1.3.3.2.</span> <span class="nav-text">&#x3D;（等号）伪指令</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%9C%B0%E5%9D%80%E8%AE%A1%E6%95%B0%E5%99%A8-%E5%92%8CORG%E4%BC%AA%E6%8C%87%E4%BB%A4"><span class="nav-number">1.3.4.</span> <span class="nav-text">地址计数器$和ORG伪指令</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#%E5%9C%B0%E5%9D%80%E8%AE%A1%E6%95%B0%E5%99%A8"><span class="nav-number">1.3.4.1.</span> <span class="nav-text">地址计数器$</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#ORG%E4%BC%AA%E6%8C%87%E4%BB%A4"><span class="nav-number">1.3.4.2.</span> <span class="nav-text">ORG伪指令</span></a></li></ol></li></ol></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#BIOS%E5%92%8CDOS%E4%B8%AD%E6%96%AD"><span class="nav-number">2.</span> <span class="nav-text">BIOS和DOS中断</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#BIOS%E5%92%8CDOS%E7%9A%84%E4%B8%AD%E6%96%AD%E7%B1%BB%E5%9E%8B"><span class="nav-number">2.1.</span> <span class="nav-text">BIOS和DOS的中断类型</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#BIOS%E5%92%8CDOS%E5%8A%9F%E8%83%BD%E8%B0%83%E7%94%A8%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%AD%A5%E9%AA%A4"><span class="nav-number">2.2.</span> <span class="nav-text">BIOS和DOS功能调用的基本步骤</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E5%B8%B8%E8%A7%81%E7%9A%84BIOS%E5%92%8CDOS%E5%8A%9F%E8%83%BD%E8%B0%83%E7%94%A8"><span class="nav-number">2.3.</span> <span class="nav-text">常见的BIOS和DOS功能调用</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%94%AE%E7%9B%98%E8%BE%93%E5%85%A5%E4%B8%AD%E6%96%AD%E8%B0%83%E7%94%A8"><span class="nav-number">2.3.1.</span> <span class="nav-text">键盘输入中断调用</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#BIOS%E9%94%AE%E7%9B%98%E4%B8%AD%E6%96%AD"><span class="nav-number">2.3.1.1.</span> <span class="nav-text">BIOS键盘中断</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#DOS%E9%94%AE%E7%9B%98%E4%B8%AD%E6%96%AD"><span class="nav-number">2.3.1.2.</span> <span class="nav-text">DOS键盘中断</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E5%BA%94%E7%94%A8"><span class="nav-number">2.3.1.3.</span> <span class="nav-text">应用</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%98%BE%E7%A4%BA%E5%99%A8%E8%BE%93%E5%87%BA%E4%B8%AD%E6%96%AD%E8%B0%83%E7%94%A8"><span class="nav-number">2.3.2.</span> <span class="nav-text">显示器输出中断调用</span></a></li></ol></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E5%AD%90%E7%A8%8B%E5%BA%8F%E7%BB%93%E6%9E%84"><span class="nav-number">3.</span> <span class="nav-text">子程序结构</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#%E5%AD%90%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%BB%93%E6%9E%84%E5%BD%A2%E5%BC%8F"><span class="nav-number">3.1.</span> <span class="nav-text">子程序的结构形式</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E5%AD%90%E7%A8%8B%E5%BA%8F%E7%9A%84%E5%AE%9A%E4%B9%89"><span class="nav-number">3.2.</span> <span class="nav-text">子程序的定义</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E5%AD%90%E7%A8%8B%E5%BA%8F%E7%9A%84%E5%8F%82%E6%95%B0%E4%BC%A0%E9%80%81"><span class="nav-number">3.3.</span> <span class="nav-text">子程序的参数传送</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E7%BB%83%E4%B9%A0%E9%A2%98"><span class="nav-number">4.</span> <span class="nav-text">练习题</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E8%AF%BE%E5%90%8E%E9%A2%98"><span class="nav-number">5.</span> <span class="nav-text">课后题</span></a></li></ol></div>
        </div>
        <!--/noindex-->

        <div class="site-overview-wrap sidebar-panel">
          <div class="site-author animated" itemprop="author" itemscope itemtype="http://schema.org/Person">
    <img class="site-author-image" itemprop="image" alt="Wyatex"
      src="/images/avatar.jpg">
  <p class="site-author-name" itemprop="name">Wyatex</p>
  <div class="site-description" itemprop="description">这里是我用来做笔记的网站哟~</div>
</div>
<div class="site-state-wrap animated">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
        <a href="/archives/">
          <span class="site-state-item-count">155</span>
          <span class="site-state-item-name">日志</span>
        </a>
      </div>
      <div class="site-state-item site-state-categories">
          <a href="/categories/">
        <span class="site-state-item-count">26</span>
        <span class="site-state-item-name">分类</span></a>
      </div>
      <div class="site-state-item site-state-tags">
          <a href="/tags/">
        <span class="site-state-item-count">97</span>
        <span class="site-state-item-name">标签</span></a>
      </div>
  </nav>
</div>
  <div class="links-of-author animated">
      <span class="links-of-author-item">
        <a href="https://github.com/wyatex" title="GitHub → https:&#x2F;&#x2F;github.com&#x2F;wyatex" rel="noopener me" target="_blank"><i class="fab fa-github fa-fw"></i>GitHub</a>
      </span>
      <span class="links-of-author-item">
        <a href="mailto:wyatex@qq.com" title="E-Mail → mailto:wyatex@qq.com" rel="noopener me" target="_blank"><i class="fa fa-envelope fa-fw"></i>E-Mail</a>
      </span>
  </div>

        </div>
      </div>
    </div>

    
    <div class="sidebar-inner sidebar-blogroll">
      <div class="links-of-blogroll animated">
        <div class="links-of-blogroll-title"><i class="fa fa-globe fa-fw"></i>
          链接
        </div>
        <ul class="links-of-blogroll-list">
            <li class="links-of-blogroll-item">
              <a href="https://antfu.me/" title="https:&#x2F;&#x2F;antfu.me&#x2F;" rel="noopener" target="_blank">Anthony Fu</a>
            </li>
            <li class="links-of-blogroll-item">
              <a href="https://www.codesky.me/" title="https:&#x2F;&#x2F;www.codesky.me&#x2F;" rel="noopener" target="_blank">CodeSky</a>
            </li>
            <li class="links-of-blogroll-item">
              <a href="https://learn.lianglianglee.com/" title="https:&#x2F;&#x2F;learn.lianglianglee.com&#x2F;" rel="noopener" target="_blank">技术文章摘抄</a>
            </li>
        </ul>
      </div>
    </div>
        <div class="pjax">
        </div>
  </aside>


    </div>

    <div class="main-inner post posts-expand">


  


<div class="post-block">
  
  

  <article itemscope itemtype="http://schema.org/Article" class="post-content" lang="zh-CN">
    <link itemprop="mainEntityOfPage" href="https://wyatex.online/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%BE%AE%E6%9C%BA%E4%B8%8E%E6%8E%A5%E5%8F%A3%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0%EF%BC%883%EF%BC%89/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.jpg">
      <meta itemprop="name" content="Wyatex">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="Wyatex`s blog">
      <meta itemprop="description" content="这里是我用来做笔记的网站哟~">
    </span>

    <span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
      <meta itemprop="name" content="微机与接口技术笔记（3） | Wyatex`s blog">
      <meta itemprop="description" content="">
    </span>
      <header class="post-header">
        <h1 class="post-title" itemprop="name headline">
          微机与接口技术笔记（3）
        </h1>

        <div class="post-meta-container">
          <div class="post-meta">
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar"></i>
      </span>
      <span class="post-meta-item-text">发表于</span>

      <time title="创建时间：2020-10-29 19:55:03" itemprop="dateCreated datePublished" datetime="2020-10-29T19:55:03+08:00">2020-10-29</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar-check"></i>
      </span>
      <span class="post-meta-item-text">更新于</span>
      <time title="修改时间：2023-05-05 09:25:47" itemprop="dateModified" datetime="2023-05-05T09:25:47+08:00">2023-05-05</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-folder"></i>
      </span>
      <span class="post-meta-item-text">分类于</span>
        <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
          <a href="/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/" itemprop="url" rel="index"><span itemprop="name">学习笔记</span></a>
        </span>
    </span>

  
    <span class="post-meta-item" title="阅读次数" id="busuanzi_container_page_pv">
      <span class="post-meta-item-icon">
        <i class="far fa-eye"></i>
      </span>
      <span class="post-meta-item-text">阅读次数：</span>
      <span id="busuanzi_value_page_pv"></span>
    </span>
</div>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody"><p>依然是第三章的内容，上一篇整理完了8086指令系统中主要的指令，这次主要讲程序格式和程序结构</p>
<span id="more"></span>

<h1 id="汇编语言程序格式"><a href="#汇编语言程序格式" class="headerlink" title="汇编语言程序格式"></a>汇编语言程序格式</h1><p>汇编语言源程序汇编成目标平台的可执行文件的步骤是：</p>
<ol>
<li>编写源程序，保存到xxx.asm或者xxx.a文件</li>
<li>通过汇编程序转换成xxx.obj或者xxx.o文件</li>
<li>通过连接程序连接成xxx.exe或者xxx.out文件</li>
</ol>
<h2 id="汇编语言程序书写格式"><a href="#汇编语言程序书写格式" class="headerlink" title="汇编语言程序书写格式"></a>汇编语言程序书写格式</h2><p>汇编语言源程序的结构采用分段结构形式，一个汇编语言源程序时由若干个逻辑段组成，<strong>每个逻辑段由SEGMENT语句开始，由ENDS语句结束</strong>。<strong>整个源程序以END语句结束</strong>。通常，一个汇编语言源程序一般应该由3个逻辑段组成，即<strong>数据段、堆栈段和代码段</strong>。</p>
<p>作为汇编源程序主模块，以下几部分不可缺少：</p>
<ul>
<li>必须使用ASSUME伪指令告诉汇编程序，哪一段和哪一个段寄存器对应，即某一段地址应该放入哪一个段寄存器。这样对源程序模块进行汇编时，才能确定段中各项的偏移量。</li>
<li>DOS的装入程序在装入执行时，将把CS初始化为代码段地址，把SS初始化为堆栈段地址，因此在源程序中不需要再对它们进行初始化。<br>对数据段初始化语句如下：<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">MOV  AX，DATA（数据段段名）</span><br><span class="line">MOV  DS，AX</span><br></pre></td></tr></table></figure></li>
<li>在DOS环境下，通常采用DOS的4CH号中断功能调用使汇编语言返回DOS，即采用如下两条指令：<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">MOV  AH，4CH</span><br><span class="line">INT  21H</span><br></pre></td></tr></table></figure></li>
</ul>
<p>8086宏汇编MASM使用的语句有3种类型：指令语句、伪指令语句和宏指令语句。</p>
<p>汇编语言程序中的每个语句可以由四项组成，格式如下：<br> <strong>[名字]: 操作符 操作数，操作数 ；注释</strong><br>其中各项之间必须用空格（space）符隔开，名字项与操作数项间一般使用“∶”作分隔符，操作数项之间一般使用“，”作分隔符，操作数项与注释项间使用“；”作分隔符。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">START∶ MOV  AX，1234H；立即数送往寄存器AX</span><br><span class="line">        MOV  BX，AX ；AX内容送往寄存器BX</span><br></pre></td></tr></table></figure>

<h3 id="名字项"><a href="#名字项" class="headerlink" title="名字项"></a>名字项</h3><p>名字项是一个符号，它表示本条语句的符号地址。一般来讲，名字项可以是标号或变量。它是由非数字开头的字符串，可由下列字符组成：</p>
<ol>
<li>字母  A～Z，a～z。</li>
<li>数字  0～9。</li>
<li>专用字符  ？、· 、@、-、$。</li>
</ol>
<p>除数字外，所有字符均可以作名字的开始字符；专用字符“·”只能作为标号的开始符号。</p>
<h3 id="操作符项"><a href="#操作符项" class="headerlink" title="操作符项"></a>操作符项</h3><p>操作符项可以是指令、伪指令或宏指令的助记符。伪指令没有对应的机器码，只是在汇编过程中完成相应的控制操作。</p>
<h3 id="操作数项"><a href="#操作数项" class="headerlink" title="操作数项"></a>操作数项</h3><p>操作数项由一个或多个表达式组成，多个操作数项之间一般用逗号分开。</p>
<h3 id="注释项"><a href="#注释项" class="headerlink" title="注释项"></a>注释项</h3><p>注释项用来说明一段程序、一条或多条指令的功能，提高程序的可读性，便于程序的阅读。</p>
<h2 id="表达式与运算符"><a href="#表达式与运算符" class="headerlink" title="表达式与运算符"></a>表达式与运算符</h2><p>表达式由常数、寄存器、标号、变量与一些运算符组合而成，可以有数字表达式和地址表达式两种。</p>
<p>8086汇编语言中的运算符：</p>
<table cellpadding="0" cellspacing="0" width="864" style="width: 804px;">
    <tbody>
        <tr height="61" style=";height:61px" class="firstRow">
            <td height="61" width="135" style="">
                <p>
                    算术运算符
                </p>
            </td>
            <td width="183" style="">
                <p>
                    逻辑与移位运算符
                </p>
            </td>
            <td width="177" style="">
                <p>
                    关系运算符
                </p>
            </td>
            <td width="213" style="">
                <p>
                    分析运算符
                </p>
            </td>
            <td width="156" style="">
                <p>
                    属性运算符
                </p>
            </td>
        </tr>
        <tr height="35" style=";height:35px">
            <td height="35" width="135" style="">
                <p>
                    +（加法）
                </p>
            </td>
            <td width="183" style="">
                <p>
                    AND（与）
                </p>
            </td>
            <td width="177" style="">
                <p>
                    EQ（相等）
                </p>
            </td>
            <td width="213" style="">
                <p>
                    SEG（求段基值）
                </p>
            </td>
            <td width="156" style="">
                <p>
                    PTR
                </p>
            </td>
        </tr>
        <tr height="35" style=";height:35px">
            <td height="35" width="135" style="">
                <p>
                    -（减法）
                </p>
            </td>
            <td width="183" style="">
                <p>
                    OR（或）
                </p>
            </td>
            <td width="177" style="">
                <p>
                    NE（不相等）
                </p>
            </td>
            <td width="213" style="">
                <p>
                    OFFSET（求偏移量）
                </p>
            </td>
            <td width="156" style="">
                <p>
                    “：”段运算符
                </p>
            </td>
        </tr>
        <tr height="35" style=";height:35px">
            <td height="35" width="135" style="">
                <p>
                    *（乘法）
                </p>
            </td>
            <td width="183" style="">
                <p>
                    XOR（异或）
                </p>
            </td>
            <td width="177" style="">
                <p>
                    LT（小于）
                </p>
            </td>
            <td width="213" style="">
                <p>
                    TYPE（求变量类型）
                </p>
            </td>
            <td width="156" style="">
                <p>
                    THIS
                </p>
            </td>
        </tr>
        <tr height="61" style=";height:61px">
            <td height="61" width="135" style="">
                <p>
                    /（除法）
                </p>
            </td>
            <td width="183" style="">
                <p>
                    NOT（非）
                </p>
            </td>
            <td width="177" style="">
                <p>
                    GT（大于）
                </p>
            </td>
            <td width="213" style="">
                <p>
                    LENGTH（求变量长度）
                </p>
            </td>
            <td width="156" style="">
                <p>
                    SHORT
                </p>
            </td>
        </tr>
        <tr height="35" style=";height:35px">
            <td height="35" width="135" style="">
                <p>
                    MOD（求余）
                </p>
            </td>
            <td width="183" style="">
                <p>
                    SHL（左移）
                </p>
            </td>
            <td width="177" style="">
                <p>
                    LE（小于或等于）
                </p>
            </td>
            <td width="213" style="">
                <p>
                    SIZE（求字节数）
                </p>
            </td>
            <td width="156" style="">
                <p>
                    HIGH
                </p>
            </td>
        </tr>
        <tr height="74" style=";height:74px">
            <td height="74" width="135" style=""></td>
            <td width="183" style="">
                <p>
                    SHR（右移）
                </p>
            </td>
            <td width="177" style="">
                <p>
                    GE（大于或等于）
                </p>
            </td>
            <td width="213" style=""></td>
            <td width="156" style="">
                <p>
                    LOW
                </p>
            </td>
        </tr>
    </tbody>
</table>

<h2 id="伪指令语句"><a href="#伪指令语句" class="headerlink" title="伪指令语句"></a>伪指令语句</h2><p>伪指令是控制汇编过程的命令，又称为汇编控制命令。它具有数据定义、存储区分配、指示程序的开始与结束等功能，但是没有对应的机器码。将汇编语言源程序翻译为目标程序后，其作用消失。</p>
<h3 id="段定义伪指令"><a href="#段定义伪指令" class="headerlink" title="段定义伪指令"></a>段定义伪指令</h3><p>此伪指令实现存储器的分段管理，在汇编和连接程序时，控制不同段的定位类型、组合类型与连接，形成一个可执行程序。<br>常用的段定义伪指令有SEGMENT、ENDS和ASSUME等。</p>
<h4 id="SEGMENT-ENDS伪指令"><a href="#SEGMENT-ENDS伪指令" class="headerlink" title="SEGMENT&#x2F;ENDS伪指令"></a>SEGMENT&#x2F;ENDS伪指令</h4><p>指令格式</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">段名    SEGMENT     [定位类型][组合类型][类别]</span><br><span class="line">……</span><br><span class="line">……</span><br><span class="line">段名    ENDS</span><br></pre></td></tr></table></figure>
<p><strong>定位类型</strong>（align_type）说明段的起始地址应是如何的边界值。</p>
<table cellpadding="0" cellspacing="0" width="864" style="width: 804px;">
    <tbody>
        <tr height="81" style=";height:81px" class="firstRow">
            <td height="81" width="103" style="">
                <p>
                    PARA
                </p>
            </td>
            <td width="761" style="">
                <p>
                    该段的必须从小段边界开始。即段的起始地址最低4位必须为0，应为xxxx0H。
                </p>
            </td>
        </tr>
        <tr height="81" style=";height:81px">
            <td height="81" width="103" style="">
                <p>
                    BYTE
                </p>
            </td>
            <td width="761" style="">
                <p>
                    该段可以从任何地址开始。
                </p>
            </td>
        </tr>
        <tr height="81" style=";height:81px">
            <td height="81" width="103" style="">
                <p>
                    WORD
                </p>
            </td>
            <td width="761" style="">
                <p>
                    该段必须从字的边界地址开始，即段的起始地址必须为偶数。
                </p>
            </td>
        </tr>
        <tr height="81" style=";height:81px">
            <td height="81" width="103" style="">
                <p>
                    PAGE
                </p>
            </td>
            <td width="761" style="">
                <p>
                    该段必须从页的边界地址开始，即段的起始地址最低8位必须为00，应为xxx00H。
                </p>
            </td>
        </tr>
    </tbody>
</table>

<p><strong>组合类型</strong>（combine_type）说明程序连接是段合并方法。</p>
<table cellpadding="0" cellspacing="0" width="831" style="width: 804px;">
    <tbody>
        <tr height="61" style=";height:61px" class="firstRow">
            <td height="61" width="131" style="">
                <p>
                    PRIVATE
                </p>
            </td>
            <td width="700" style="">
                <p>
                    私有段，在连接时将不与其他模块中的同名分段合并。组合类型的默认项。
                </p>
            </td>
        </tr>
        <tr height="64" style=";height:64px">
            <td height="64" width="131" style="">
                <p>
                    PUBLIC
                </p>
            </td>
            <td width="700" style="">
                <p>
                    连接时，对于不同程序模块中逻辑段，如果具有相同的类别名，就把这些段顺序连接成为一个逻辑段转入内存。
                </p>
            </td>
        </tr>
        <tr height="112" style=";height:112px">
            <td height="112" width="131" style="">
                <p>
                    COMMON
                </p>
            </td>
            <td width="700" style="">
                <p>
                    连接时，对于不同程序逻辑段，如果具有相同的类别名，则都从同一个地址开始装入，因而各个逻辑段将发生重叠。最后，连接以后的段的长度等于原来的逻辑段的长度，重叠部分的内容是最后一个逻辑段的内容。
                </p>
            </td>
        </tr>
        <tr height="64" style=";height:64px">
            <td height="64" width="131" style="">
                <p>
                    STACK
                </p>
            </td>
            <td width="700" style="">
                <p>
                    本段是堆栈的一部分，连接程序将所有STACK段按照与PUBLIC段的同样方式进行合并。这是堆栈段必须具有的段组合。
                </p>
            </td>
        </tr>
        <tr height="37" style=";height:37px">
            <td height="37" width="131" style="">
                <p>
                    AT表达式
                </p>
            </td>
            <td width="700" style="">
                <p>
                    使段地址时表达式所计算出来的16位值。但它不能用来指定代码段。
                </p>
            </td>
        </tr>
        <tr height="60" style=";height:60px">
            <td height="60" width="131" style="">
                <p>
                    MEMORY
                </p>
            </td>
            <td width="700" style="">
                <p>
                    与PUBLIC相同。
                </p>
            </td>
        </tr>
    </tbody>
</table>

<p><strong>类别</strong>（’class’）在引号中给出连接时组成段的类型名。当连接程序组织段时，将所有的同类别段相邻分配，段类别可以是任意名称，但<strong>必须位于单引号中</strong>。</p>
<h4 id="ASSUME伪指令"><a href="#ASSUME伪指令" class="headerlink" title="ASSUME伪指令"></a>ASSUME伪指令</h4><p>指令格式：<code>ASSUME  段寄存器名：段名[,段寄存器名：段名[,...]]</code></p>
<p>对于8086&#x2F;8088 CPU而言，汇编过程中，ASSUME伪指令只是设定了段寄存器（CS、DS、SS和ES）应指向哪一个程序段，并没有给各个段寄存器装入实际值（CS除外）。因此，必须在程序中安排为段寄存器赋值的指令。段名必须与SEGMENT定义的相对应。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">DATA    SEGMENT   ; 数据段</span><br><span class="line">           </span><br><span class="line">DATA    ENDS</span><br><span class="line">......</span><br><span class="line">STACK   SEGMENT PARA STACK′STACK′；堆栈段</span><br><span class="line"></span><br><span class="line">STACK   ENDS</span><br><span class="line">......</span><br><span class="line">CODE    SEGMENT   ; 代码段</span><br><span class="line">   </span><br><span class="line">CODE    ENDS</span><br></pre></td></tr></table></figure>

<h3 id="数据定义伪指令"><a href="#数据定义伪指令" class="headerlink" title="数据定义伪指令"></a>数据定义伪指令</h3><p>数据定义伪指令通常用来定义一个变量的类型，并将所需要的数据放入指定的存储单元中，也可以只给变量分配存储单元，而不赋予特定的值。<br>常用的数据定义伪指令有DB、DW、DD、DQ和DT。配合定义数据伪指令的重复操作符DUP（duplication operator）伪指令。</p>
<h4 id="定义字节变量伪指令DB"><a href="#定义字节变量伪指令DB" class="headerlink" title="定义字节变量伪指令DB"></a>定义字节变量伪指令DB</h4><p>DB（Define Byte）用于定义变量的类型为字节变量BYTE，并给变量分配字节或字节串，DB伪指令后面的操作数每个占用一个字节</p>
<h4 id="定义字变量伪指令DW"><a href="#定义字变量伪指令DW" class="headerlink" title="定义字变量伪指令DW"></a>定义字变量伪指令DW</h4><p>DW（Define Word）用于定义变量的类型为字变量WORD，并给变量分配字或字串，DW伪指令后面的操作数每个占用1个字，即2个字节。在内存中存放时，低位字节存放在低地址中，高位字节存放在高地址中。</p>
<h4 id="定义双字变量伪指令DD"><a href="#定义双字变量伪指令DD" class="headerlink" title="定义双字变量伪指令DD"></a>定义双字变量伪指令DD</h4><p>DD（Define Double word）用于定义变量的类型为双字变量，DD伪指令后面的操作数每个占用2个字，即4个字节。在内存中存放时，低位字节存放在低地址中，高位字节存放在高地址中。</p>
<h4 id="定义四字变量伪指令DQ"><a href="#定义四字变量伪指令DQ" class="headerlink" title="定义四字变量伪指令DQ"></a>定义四字变量伪指令DQ</h4><p>DQ（Define Quadruple word）用于定义变量的类型为四字变量，DQ伪指令后面的操作数每个占用4个字，即8个字节。在内存中存放时，低位字节存放在低地址中，高位字节存放在高地址中。</p>
<h4 id="定义十字节变量伪指令DT"><a href="#定义十字节变量伪指令DT" class="headerlink" title="定义十字节变量伪指令DT"></a>定义十字节变量伪指令DT</h4><p>DT（Define Ten byte）用于定义变量的类型为十字节，DT伪指令后面的操作数每个占用10个字节。一般用于存储压缩的BCD码。</p>
<p>数据定义伪指令后面的操作数可以是常数、表达式或字符串，但每项操作数的值不能超过由伪指令所定义的数据类型限定的范围。</p>
<p>例：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">DATA  SEGMENT                 ；定义数据段开始</span><br><span class="line">B1    DB  10H，30H            ；存入两个字节10H，30H</span><br><span class="line">B2    DB  2*3+5               ；存入表达式的值0BH</span><br><span class="line">S1    DB  ‘HELLO’             ；存入5个字符，每个字符按ASCII码存入</span><br><span class="line">W1    DW  2000H，3000H        ；存入两个字2000H，3000H</span><br><span class="line">W2    DD   12345678H          ；存入双字（5678H，1234H）</span><br><span class="line">W3    DQ   1234567887654321H  ；存入四字（4321H，8765H，5678H，  1234H）</span><br><span class="line">DATA  ENDS                    ；数据段结束</span><br></pre></td></tr></table></figure>

<h4 id="DUP（duplication-operator）用于重复某个（或某些）操作数。"><a href="#DUP（duplication-operator）用于重复某个（或某些）操作数。" class="headerlink" title="DUP（duplication operator）用于重复某个（或某些）操作数。"></a>DUP（duplication operator）用于重复某个（或某些）操作数。</h4><p><code>[变量名] DB/DW/DD/DQ/DT〈表达式1〉 DUP〈表达式2〉</code><br>〈表达式1〉为重复次数，〈表达式2〉为重复的内容.</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">MEM1 DB 3  DUP (4,5);从MEM1地址单元开始存放三组“04H，05H”共6个地址单元</span><br><span class="line">MEM2 DW 30 DUP(?)   ;从MEM2地址单元开始保留30个字共60个地址单元</span><br><span class="line">MEM3 DB 10 DUP(1,2,3 DUP(3),4) ;从MEM3地址单元开始存放十组“01，02，03，03，03，04”，共占用60个地址单元。</span><br></pre></td></tr></table></figure>
<h3 id="符号定义伪指令"><a href="#符号定义伪指令" class="headerlink" title="符号定义伪指令"></a>符号定义伪指令</h3><p>符号定义伪指令的用途是给一个符号重新命名，或定义新的类型属性等。</p>
<h4 id="EQU伪指令"><a href="#EQU伪指令" class="headerlink" title="EQU伪指令"></a>EQU伪指令</h4><p>指令格式：<code>名字  EQU  表达式</code><br>EQU伪指令的作用是将表达式的值赋给一个名字，以后可以用这个名字来代替上述表达式。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">COUTN   EQU  200            ;COUNT代替常数200</span><br><span class="line">VAL     EQU  ASCII_TABLE    ;VAL代替变量ASSCII_TABLE</span><br><span class="line">SUM     EQU  3*2            ;SUM代替数值表达式：3*2</span><br><span class="line">ADDR    EQU  [BP+8]         ;ADDR代替地址表达式：[BP+8]</span><br><span class="line">C       EQU  CX             ;C代替寄存器CX</span><br><span class="line">M       EQU  MOV            ;M代替指令助记符MOV</span><br></pre></td></tr></table></figure>

<h4 id="（等号）伪指令"><a href="#（等号）伪指令" class="headerlink" title="&#x3D;（等号）伪指令"></a>&#x3D;（等号）伪指令</h4><p>“&#x3D;”（等号）伪指令的功能与EQU伪指令基本相同，<strong>主要区别在于它可以对同一个名字重复定义，而EQU不能。</strong></p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">COUTN  EQU  200     ;正确，COUNT代替常数200</span><br><span class="line">COUTN  EQU  300     ;错误，COUNT不能再次定义</span><br><span class="line">COUTN  = 200        ;正确，COUNT代替常数200</span><br><span class="line">COUTN  = 300        ;正确，COUNT可以重复定义，即COUNT代替常数300</span><br></pre></td></tr></table></figure>
<h3 id="地址计数器-和ORG伪指令"><a href="#地址计数器-和ORG伪指令" class="headerlink" title="地址计数器$和ORG伪指令"></a>地址计数器$和ORG伪指令</h3><h4 id="地址计数器"><a href="#地址计数器" class="headerlink" title="地址计数器$"></a>地址计数器$</h4><p>地址计数器的值可用$来表示，汇编语言允许用户直接使用$来引用地址计数器的值</p>
<h4 id="ORG伪指令"><a href="#ORG伪指令" class="headerlink" title="ORG伪指令"></a>ORG伪指令</h4><p>ORG是起始位置设置伪指令，用来设置当前地址计数器的值。<br>指令格式：<code>ORG  数值表达式</code></p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">DATA    SEGMENT                     ;定义数据段开始</span><br><span class="line">        ORG   0010H                 ;预置VAR1的偏移量为00010H</span><br><span class="line">        VAR1  DB 20H,30H,40H        ;VAR1的初始化数据</span><br><span class="line">        ORG   $+13                  ;预置VAR2的偏移量为00020H</span><br><span class="line">        VAR2  DW  5678H             ;VAR2的初始化数据</span><br><span class="line">DATA    ENDS                        ;数据段结束</span><br></pre></td></tr></table></figure>

<h1 id="BIOS和DOS中断"><a href="#BIOS和DOS中断" class="headerlink" title="BIOS和DOS中断"></a>BIOS和DOS中断</h1><p>基本输入输出系统（Basic Input&#x2F;Output System，BIOS）给PC系列的不同微处理器提供了兼容的系统加电自检、引导装入、主要I&#x2F;O设备的处理程序以及接口控制等功能模块来处理所有的系统中断。使用BIOS功能调用，程序员不必了解硬件的具体细节，可直接使用指令设置参数，调用BIOS示例程序，所以利用BIOS功能调用编写的程序简洁，可读性好，而且易于移植。</p>
<p>磁盘操作系统（Disk Operating System，DOS）是PC机上最重要的操作系统，它是由软盘或硬盘提供的。它的两个DOS模块<code>IBMBIO.COM</code>和<code>IBMDOS.COM</code>使BIOS使用起来更方便。</p>
<p><code>IBMBIO.COM</code>是输入输出设备处理程序，它提供了DOS到ROM和BIOS的低级接口，完成将数据从外设读入内存，或把数据从内存写到外设去工作。 <code>IBMDOS.COM</code>包含一个文件管理程序和一些处理程序，在DOS下运行的程序可以调用这些处理程序。</p>
<p><strong>DOS功能与BIOS功能都是通过软件中断调用。在中断调用前需要把功能号装入AH寄存器，把子功能号装入AL寄存器，除此之外，通常还需要在CPU寄存器中提供专门的调用参数。</strong></p>
<h2 id="BIOS和DOS的中断类型"><a href="#BIOS和DOS的中断类型" class="headerlink" title="BIOS和DOS的中断类型"></a>BIOS和DOS的中断类型</h2><p>不同微机系列的BIOS和DOS的中断类型各有差异。下面给出的是IBM PC系统主要的BIOS中断类型和DOS中断类型</p>
<table cellpadding="0" cellspacing="0" width="880" style="width: 804px;">
    <tbody>
        <tr height="43" style=";height:43px" class="firstRow">
            <td height="43" width="159" style="">
                <p>
                    CPU中断类型
                </p>
            </td>
            <td width="229" style="">
                <p>
                    8259中断类型
                </p>
            </td>
            <td width="193" style="">
                <p>
                    BIOS中断类型
                </p>
            </td>
            <td width="299" style="">
                <p>
                    用户应用程序和数据表指针
                </p>
            </td>
        </tr>
        <tr height="43" style=";height:43px">
            <td rowspan="4" height="365" width="159" style="">
                <p>
                    0 &nbsp; 除法错
                </p>
                <p>
                    1 &nbsp; 单步
                </p>
                <p>
                    2 &nbsp; 非屏蔽中断
                </p>
                <p>
                    3 &nbsp; 断点
                </p>
                <p>
                    4 &nbsp; 溢出
                </p>
                <p>
                    5 &nbsp; 打印屏幕
                </p>
                <p>
                    6 &nbsp; 保留
                </p>
                <p>
                    7 &nbsp; 保留
                </p>
            </td>
            <td rowspan="4" width="229" style="">
                <p>
                    8 &nbsp; 系统定时器(IRQ0)
                </p>
                <p>
                    9 &nbsp; 键盘(IRQ1)
                </p>
                <p>
                    A &nbsp; 彩色/图形接口(IRQ2)
                </p>
                <p>
                    B &nbsp; COM2控制器(IRQ3)
                </p>
                <p>
                    C &nbsp; COM1控制器(IRQ4)
                </p>
                <p>
                    D &nbsp; LPT2控制器(IRQ4)
                </p>
                <p>
                    E &nbsp; 磁盘控制器(IRQ4)
                </p>
                <p>
                    F &nbsp; LTP1控制器(IRQ4)
                </p>
            </td>
            <td rowspan="4" width="193" style="">
                <p>
                    10 &nbsp; 显示器I/O
                </p>
                <p>
                    11 &nbsp; 取设备信息
                </p>
                <p>
                    12 &nbsp; 取内存信息
                </p>
                <p>
                    13 &nbsp; 磁盘I/O
                </p>
                <p>
                    14 &nbsp; RS-232串口I/O
                </p>
                <p>
                    15 &nbsp; 磁盘I/O
                </p>
                <p>
                    16 键盘I/O
                </p>
                <p>
                    17打印机I/O
                </p>
                <p>
                    18 &nbsp; ROM&nbsp; BASIC
                </p>
                <p>
                    19 &nbsp; 引导装入程序
                </p>
                <p>
                    1A &nbsp; 时钟
                </p>
                <p>
                    40 &nbsp; 软盘BIOS
                </p>
            </td>
            <td width="299" style="">
                <p>
                    用户应用程序
                </p>
            </td>
        </tr>
        <tr height="100" style=";height:100px">
            <td height="100" width="299" style="">
                <p>
                    1B &nbsp; 键盘终止地址(Ctrl+Break)
                </p>
                <p>
                    4A &nbsp; 报警（用户闹钟）
                </p>
                <p>
                    1C &nbsp; 定时器
                </p>
            </td>
        </tr>
        <tr height="43" style=";height:43px">
            <td height="43" width="299" style="">
                <p>
                    数据表指针
                </p>
            </td>
        </tr>
        <tr height="178" style=";height:178px">
            <td height="178" width="299" style="">
                <p>
                    1D &nbsp; 显示器参数表
                </p>
                <p>
                    1E &nbsp; 软盘参数表
                </p>
                <p>
                    1F &nbsp; 图形字符扩展码
                </p>
                <p>
                    41 &nbsp; 0#硬盘参数表
                </p>
                <p>
                    46 &nbsp; 1#硬盘参数表
                </p>
                <p>
                    49 &nbsp; 指向键盘增强服务变换表
                </p>
            </td>
        </tr>
    </tbody>
</table>

<blockquote>
<p>BIOS中断</p>
</blockquote>
<table cellpadding="0" cellspacing="0" width="872" style="width: 804px;">
    <tbody>
        <tr class="firstRow">
            <td width="219" style="">
                <p>
                    功能调用号
                </p>
            </td>
            <td width="219" style="">
                <p>
                    功能说明
                </p>
            </td>
            <td width="219" style="">
                <p>
                    功能调用号
                </p>
            </td>
            <td width="219" style="">
                <p>
                    功能说明
                </p>
            </td>
        </tr>
        <tr>
            <td width="219" style="">
                <p>
                    20
                </p>
                <p>
                    21
                </p>
                <p>
                    22
                </p>
                <p>
                    23
                </p>
                <p>
                    24
                </p>
                <p>
                    25
                </p>
                <p>
                    26
                </p>
            </td>
            <td width="219" style="">
                <p>
                    程序终止
                </p>
                <p>
                    功能调用
                </p>
                <p>
                    终止地址
                </p>
                <p>
                    Ctrl+C中断向量
                </p>
                <p>
                    严重错误向量
                </p>
                <p>
                    绝对磁盘读
                </p>
                <p>
                    绝对磁盘写
                </p>
            </td>
            <td width="219" style="">
                <p>
                    27
                </p>
                <p>
                    28
                </p>
                <p>
                    29
                </p>
                <p>
                    2A
                </p>
                <p>
                    2E
                </p>
                <p>
                    2F
                </p>
                <p>
                    30～3F
                </p>
            </td>
            <td width="219" style="">
                <p>
                    结束并驻留内存
                </p>
                <p>
                    键盘忙循环
                </p>
                <p>
                    快速写字符
                </p>
                <p>
                    网络接口
                </p>
                <p>
                    执行命令
                </p>
                <p>
                    多路转换接口
                </p>
                <p>
                    保留给DOS
                </p>
            </td>
        </tr>
    </tbody>
</table>

<blockquote>
<p>DOS中断</p>
</blockquote>
<h2 id="BIOS和DOS功能调用的基本步骤"><a href="#BIOS和DOS功能调用的基本步骤" class="headerlink" title="BIOS和DOS功能调用的基本步骤"></a>BIOS和DOS功能调用的基本步骤</h2><ol>
<li>将调用参数装入指定的寄存器。</li>
<li>如需要功能调用号，把它装入AH。</li>
<li>如需要子功能调用号，把它装入AL。</li>
<li>按中断号调用DOS或BIOS。</li>
<li>检查返回参数是否正确。</li>
</ol>
<h2 id="常见的BIOS和DOS功能调用"><a href="#常见的BIOS和DOS功能调用" class="headerlink" title="常见的BIOS和DOS功能调用"></a>常见的BIOS和DOS功能调用</h2><p>一般来说，实现同样的功能有时既可以用BIOS中断调用，也可以用DOS中断调用。</p>
<h3 id="键盘输入中断调用"><a href="#键盘输入中断调用" class="headerlink" title="键盘输入中断调用"></a>键盘输入中断调用</h3><h4 id="BIOS键盘中断"><a href="#BIOS键盘中断" class="headerlink" title="BIOS键盘中断"></a>BIOS键盘中断</h4><p>类型16H的中断提供了基本的键盘操作，它的中断处理程序包括3个不同的功能，可根据AH寄存器中的功能号来确定</p>
<table cellpadding="0" cellspacing="0" width="864" style="width: 804px;">
    <tbody>
        <tr height="44" style=";height:44px" class="firstRow">
            <td height="44" width="84" style="">
                <p>
                    AH
                </p>
            </td>
            <td width="219" style="">
                <p>
                    功能
                </p>
            </td>
            <td width="561" style="">
                <p>
                    返回参数
                </p>
            </td>
        </tr>
        <tr height="44" style=";height:44px">
            <td height="44" width="84" style="">
                <p>
                    0
                </p>
            </td>
            <td width="219" style="">
                <p>
                    从键盘读一字符
                </p>
            </td>
            <td width="561" style="">
                <p>
                    AL=字符码，AH=扫描码
                </p>
            </td>
        </tr>
        <tr height="44" style=";height:44px">
            <td height="44" width="84" style="">
                <p>
                    1
                </p>
            </td>
            <td width="219" style="">
                <p>
                    读键盘缓冲区的字符
                </p>
            </td>
            <td width="561" style="">
                <p>
                    如ZF=0，AL=字符码，AH=扫描码；如ZF=1，缓冲区空
                </p>
            </td>
        </tr>
        <tr height="44" style=";height:44px">
            <td height="44" width="84" style="">
                <p>
                    2
                </p>
            </td>
            <td width="219" style="">
                <p>
                    取键盘状态字节
                </p>
            </td>
            <td width="561" style="">
                <p>
                    AL=键盘状态字节
                </p>
            </td>
        </tr>
    </tbody>
</table>

<blockquote>
<p>BIOS键盘中断（INT 16H）</p>
</blockquote>
<h4 id="DOS键盘中断"><a href="#DOS键盘中断" class="headerlink" title="DOS键盘中断"></a>DOS键盘中断</h4><p>类型21H的中断提供了DOS键盘操作，它的中断处理程序包括7个不同的功能，分别根据AH寄存器中的功能号来确定</p>
<table cellpadding="0" cellspacing="0" width="864" style="width: 804px;">
    <tbody>
        <tr height="33" style=";height:33px" class="firstRow">
            <td height="33" width="65" style="">
                <p>
                    AH
                </p>
            </td>
            <td width="256" style="">
                <p>
                    功能
                </p>
            </td>
            <td width="256" style="">
                <p>
                    调用参数
                </p>
            </td>
            <td width="288" style="">
                <p>
                    返回参数
                </p>
            </td>
        </tr>
        <tr height="53" style=";height:53px">
            <td height="53" width="65" style="">
                <p>
                    <strong>1</strong>
                </p>
            </td>
            <td width="256" style="">
                <p>
                    <strong>从键盘输入一字符并回显在屏幕上</strong>
                </p>
            </td>
            <td width="256" style="">
                <p>
                    <strong>无</strong>
                </p>
            </td>
            <td width="288" style="">
                <p>
                    <strong>AL=字符</strong>
                </p>
            </td>
        </tr>
        <tr height="53" style=";height:53px">
            <td height="53" width="65" style="">
                <p>
                    <strong>6</strong>
                </p>
            </td>
            <td width="256" style="">
                <p>
                    <strong>读键盘字符，不回显</strong>
                </p>
            </td>
            <td width="256" style="">
                <p>
                    <strong>DL=0FFH</strong>
                </p>
            </td>
            <td width="288" style="">
                <p>
                    <strong>如ZF=0，AL=字符；如ZF=1，缓冲区空</strong>
                </p>
            </td>
        </tr>
        <tr height="53" style=";height:53px">
            <td height="53" width="65" style="">
                <p>
                    7
                </p>
            </td>
            <td width="256" style="">
                <p>
                    从键盘输入一个字符，不回显
                </p>
            </td>
            <td width="256" style="">
                <p>
                    无
                </p>
            </td>
            <td width="288" style="">
                <p>
                    AL=字符
                </p>
            </td>
        </tr>
        <tr height="53" style=";height:53px">
            <td height="53" width="65" style="">
                <p>
                    8
                </p>
            </td>
            <td width="256" style="">
                <p>
                    从键盘输入一个字符，不回显，检测Ctrl+Break
                </p>
            </td>
            <td width="256" style="">
                <p>
                    无
                </p>
            </td>
            <td width="288" style="">
                <p>
                    AL=字符
                </p>
            </td>
        </tr>
        <tr height="27" style=";height:27px">
            <td height="27" width="65" style="">
                <p>
                    A
                </p>
            </td>
            <td width="256" style="">
                <p>
                    输入字符到缓冲区
                </p>
            </td>
            <td width="256" style="">
                <p>
                    DS：BX=缓冲区首地址
                </p>
            </td>
            <td width="288" style="">
                <p>
                    AL=字符
                </p>
            </td>
        </tr>
        <tr height="53" style=";height:53px">
            <td height="53" width="65" style="">
                <p>
                    B
                </p>
            </td>
            <td width="256" style="">
                <p>
                    读键盘状态
                </p>
            </td>
            <td width="256" style="">
                <p>
                    无
                </p>
            </td>
            <td width="288" style="">
                <p>
                    AL=0FFH，有键入
                </p>
                <p>
                    AL=00，无键入
                </p>
            </td>
        </tr>
        <tr height="69" style=";height:69px">
            <td height="69" width="65" style="">
                <p>
                    C
                </p>
            </td>
            <td width="256" style="">
                <p>
                    清除键盘缓冲区，并调用一种键盘功能
                </p>
            </td>
            <td width="256" style="" class="selectTdClass">
                <p>
                    AL=键盘功能号
                </p>
                <p>
                    （1，6，7，8或A）
                </p>
            </td>
            <td width="288" style="" class="selectTdClass"></td>
        </tr>
    </tbody>
</table>

<blockquote>
<p>DOS键盘中断（INT 21H）</p>
</blockquote>
<h4 id="应用"><a href="#应用" class="headerlink" title="应用"></a>应用</h4><p><strong>1号系统功能调用─从键盘输入一字符并显示在屏幕上</strong></p>
<p>此调用的功能是系统扫描键盘并等待输入一个字符，有键按下时，先检查是否是Ctrl+Break键，若是则退出；否则将字符的键值（ASCII码）送入寄存器AL中，并在屏幕上显示该字符。此调用没有入口参数。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">MOV AH,1   ;1为功能号</span><br><span class="line">INT 21H</span><br></pre></td></tr></table></figure>

<p><strong>6号系统功能调用─读键盘字符</strong><br>此调用的功能是从键盘输入一个字符，或输出一个字符到屏幕。<br>如果<strong>（DL）＝0FFH，表示是从键盘输入字符</strong>。<br>当标志ZF&#x3D;0时，表示有键按下，将字符的ASCII码送入寄存器AL。<br>当标志ZF&#x3D;1时，表示无键按下，寄存器AL中不是键入字符ASCII码。<br>如果<strong>（DL）≠0FFH，表示输出一个字符到屏幕</strong>。此时DL寄存器中内容就是输出字符的ASCII码。 </p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">MOV  DL，0FFH</span><br><span class="line">MOV  AH，6；把键盘输入的一个字符送入AL中</span><br><span class="line">INT  2lH</span><br><span class="line">MOV  DL′？′</span><br><span class="line">MOV  AH，6；将DL中的字符“？”送屏幕显示</span><br><span class="line">INT  21H</span><br></pre></td></tr></table></figure>

<h3 id="显示器输出中断调用"><a href="#显示器输出中断调用" class="headerlink" title="显示器输出中断调用"></a>显示器输出中断调用</h3><p>DOS显示中断的中断处理程序包括3个不同的功能，分别根据AH寄存器中的功能号来确定。</p>
<table cellpadding="0" cellspacing="0" width="848" style="width: 804px;">
    <tbody>
        <tr height="60" style=";height:60px" class="firstRow">
            <td height="60" width="84" style="">
                <p>
                    AH
                </p>
            </td>
            <td width="201" style="">
                <p>
                    功能
                </p>
            </td>
            <td width="401" style="">
                <p>
                    调用参数
                </p>
            </td>
            <td width="163" style="">
                <p>
                    返回参数
                </p>
            </td>
        </tr>
        <tr height="97" style=";height:97px">
            <td height="97" width="84" style="">
                <p>
                    2
                </p>
            </td>
            <td width="201" style="">
                <p>
                    显示一个字符（检验Ctrl+Break）
                </p>
            </td>
            <td width="401" style="">
                <p>
                    DL=输出字符
                </p>
            </td>
            <td width="163" style="">
                <p>
                    无
                </p>
            </td>
        </tr>
        <tr height="60" style=";height:60px">
            <td rowspan="2" height="119" width="84" style="">
                <p>
                    6
                </p>
            </td>
            <td rowspan="2" width="201" style="">
                <p>
                    显示一个字符（不检验Ctrl+Break）
                </p>
            </td>
            <td width="401" style="">
                <p>
                    DL=0FF（输入）
                </p>
            </td>
            <td width="163" style="">
                <p>
                    AL=输入字符
                </p>
            </td>
        </tr>
        <tr height="59" style=";height:59px">
            <td height="59" width="401" style="">
                <p>
                    DL=字符（输出）
                </p>
            </td>
            <td width="163" style="">
                <p>
                    无
                </p>
            </td>
        </tr>
        <tr height="67" style=";height:67px">
            <td height="67" width="84" style="">
                <p>
                    9
                </p>
            </td>
            <td width="201" style="">
                <p>
                    显示字符串
                </p>
            </td>
            <td width="401" style="">
                <p>
                    DS：DX=串地址，字符串以‘$’结尾
                </p>
            </td>
            <td width="163" style="">
                <p>
                    无
                </p>
            </td>
        </tr>
    </tbody>
</table>

<p><strong>2号系统功能调用─显示一个字符（检验Ctrl+Break）</strong></p>
<p>此调用的功能是向输出设备输出一个字符码，此调用的入口参数是输出字符的ASCII码，入口参数需送入寄存器DL，没有出口参数。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">MOV DL,&#x27;A&#x27;     ; “A”为要求输出字符的ASCII码 </span><br><span class="line">MOV AH,2       ; 2为功能号</span><br><span class="line">INT 21H</span><br></pre></td></tr></table></figure>
<p>调用结果是将DL寄存器中字符‘A’通过屏幕显示（或打印机）输出</p>
<p><strong>9号系统功能调用—显示字符串</strong></p>
<p>它要求被显示输出的字符必须以“$” 字符作为结尾符。要显示输出的信息一般定义在数据段。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">MESSAGE DB ‘The sort operation is finished’,‘$’</span><br><span class="line">MOV AH,9</span><br><span class="line">MOV DX,SEG MESSAGE</span><br><span class="line">MOV DS,DX</span><br><span class="line">MOV DX,OFFSET MESSAGE</span><br><span class="line">INT 21H</span><br></pre></td></tr></table></figure>

<h1 id="子程序结构"><a href="#子程序结构" class="headerlink" title="子程序结构"></a>子程序结构</h1><p>子程序又称为过程，它相当于高级语言中的过程和函数。</p>
<h2 id="子程序的结构形式"><a href="#子程序的结构形式" class="headerlink" title="子程序的结构形式"></a>子程序的结构形式</h2><p>子程序的基本结构包括以下几部分：</p>
<ol>
<li>子程序说明。</li>
<li>保护现场和恢复现场。</li>
<li>子程序体。</li>
<li>子程序返回。</li>
</ol>
<h2 id="子程序的定义"><a href="#子程序的定义" class="headerlink" title="子程序的定义"></a>子程序的定义</h2><p>子程序又称为过程（procedure），过程要用过程定义伪指令进行定义。<br>指令格式： </p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">过程名  PROC [NEAR] 或 [FAR]</span><br><span class="line">        ...</span><br><span class="line">        （子程序体）</span><br><span class="line">        ...</span><br><span class="line">过程名  ENDP</span><br></pre></td></tr></table></figure>

<p>注意:</p>
<ol>
<li>PROC和ENDP必须成对使用</li>
<li>过程名是自定义符，可以作为标号被指令CALL调用</li>
<li>过程由RET指令返回，返回调用程序的操作与过程的属性有关。NEAR型过程属于段内调用，则RET是段内返回；FAR型过程属于段间调用，RET是段间返回。系统设定的缺省类型为NEAR。</li>
</ol>
<p>调用程序和过程在同一个代码段，属于近调用，程序形式如下:</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">MAIN    PROC  FAR        ; MAIN为调用程序</span><br><span class="line">        ...</span><br><span class="line">        CALL  DISPLAY</span><br><span class="line">        ....</span><br><span class="line">        RET</span><br><span class="line">MAIN    ENDP</span><br><span class="line">DISPLAY PROC  NEAR       ; 子程序为NEAR过程</span><br><span class="line">        PUSH  AX</span><br><span class="line">        PUSH  BX</span><br><span class="line">        ...</span><br><span class="line">        POP   BX</span><br><span class="line">        POP   AX</span><br><span class="line">        RET</span><br><span class="line">DISPLAY ENDP</span><br></pre></td></tr></table></figure>
<p>这里的MAIN和DISPLAY分别为调用程序和子程序的名字。因调用程序和子程序在同一个代码段，所以DISPLAY选择了NEAR属性。这样，但MAIN调用DISPLAY保护返回地址时，只需保护IP指令就可以了。本例也可以这样写：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">MAIN    PROC  FAR         ; MAIN为调用程序</span><br><span class="line">        ...</span><br><span class="line">        CALL  DISPLAY</span><br><span class="line">        ...</span><br><span class="line">        RET</span><br><span class="line">DISPLAY PROC  NEAR        ; 子程序为为NEAR过程</span><br><span class="line">        PUSH  AX </span><br><span class="line">        PUSH  BX</span><br><span class="line">        ...</span><br><span class="line">        POP   BX</span><br><span class="line">        POP   AX</span><br><span class="line">        RET</span><br><span class="line">DISPLAY ENDP</span><br><span class="line">MAIN    ENDP</span><br></pre></td></tr></table></figure>
<p>也就是说，过程定义可以嵌套，一个过程定义可以包括多个过程定义。</p>
<p>调用程序和过程不在同一个代码段，属于远调用，程序形式如下：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">CODE1  SEGMENT</span><br><span class="line">        ...</span><br><span class="line">         CALL  DISPLAY</span><br><span class="line">        ...</span><br><span class="line">DISPLAY PROC  FAR        ；子程序为FAR过程</span><br><span class="line">        PUSH  AX</span><br><span class="line">        PUSH  BX</span><br><span class="line">        ...</span><br><span class="line">        POP  BX</span><br><span class="line">        POP  AX</span><br><span class="line">        RET</span><br><span class="line">DISPLAY ENDP</span><br><span class="line">        ...</span><br><span class="line">CODE1   ENDS</span><br><span class="line">CODE2   SEGMENT</span><br><span class="line">        ...</span><br><span class="line">        CALL  DISPLAY</span><br><span class="line">        ...</span><br><span class="line">CODE2   ENDS</span><br></pre></td></tr></table></figure>

<h2 id="子程序的参数传送"><a href="#子程序的参数传送" class="headerlink" title="子程序的参数传送"></a>子程序的参数传送</h2><p>调用程序在调用子程序时，经常需要传送一些参数给子程序；子程序运行完成后也经常要回送一些信息给调用程序。这种调用程序和子程序之间的信息传送称之为参数传送（或称变量传送或过程通信）。参数传送方式主要分为以下三种。</p>
<ol>
<li>通过寄存器传送参数。</li>
<li>通过堆栈传送参数。</li>
<li>通过存储器传送参数。</li>
</ol>
<blockquote>
<p> 啊，第三章真的好长，知识点也很多，一章直接入门编程语言，以后还是得多看</p>
</blockquote>
<h1 id="练习题"><a href="#练习题" class="headerlink" title="练习题"></a>练习题</h1><blockquote>
<ol>
<li>汇编语言源程序经汇编、链接后生成 <code>EXE</code> 文件。</li>
<li>8086&#x2F;8088汇编语言中伪指令的定义如下：VAR DB 2DUP(1,2,3DUP(3),2DUP(1,0)) , 则在VAR存储区前10个单元的数据是 <code>1，2，3，3，3，1，0，1，0，1 </code>。</li>
<li>微处理器8086的一个段的最大范围是 <code>64</code> KB。</li>
<li>指令AND AX,0 将累加器AX的内容  <code>清零</code>   。</li>
<li>逻辑移位指令SHL用于 <code>无符号数乘2</code>  。</li>
<li>设（SS）&#x3D;2000H, (SP)&#x3D;0100H, (AX)&#x3D;2107H, 执行指令PUSH AX后，存放数据21H的物理地址为 <code>200FFH</code> 。</li>
</ol>
</blockquote>
<h1 id="课后题"><a href="#课后题" class="headerlink" title="课后题"></a>课后题</h1><p><strong>名称解释：操作数，操作码，立即数，寄存器操作数，储存器操作数，汇编，汇编程序，汇编程序语言，伪指令，中断。</strong></p>
<p>答：操作数：操作数指出指令执行的操作所需要数据的来源。操作码：用来表示该指令应进行什么性质的操作。立即数：通常把在立即寻址方式指令中给出的数称为立即数。寄存器操作数：表示某一个寄存器，操作数本身存放于寄存器中，在指令中只是给出了几个位的代码来表示它具体存放在哪个寄存器中。储存器操作数：和寄存器操作数差不多，操作数本身放在储存器中。汇编：汇编指将汇编语言源程序转换成对应的机器语言程序。  汇编程序：指把汇编语言书写的程序翻译成与之等价的机器语言程序的翻译程序。汇编程序语言：是一种面向CPU指令系统的程序设计语言。伪指令：是控制汇编过程的命令，又称为汇编控制命令。中断：指计算机运行过程中，出现某些意外情况需主机干预时，机器能自动停止正在运行的程序并转入处理新情况的程序，处理完毕后又返回原被暂停的程序继续运行。</p>
<p><strong>请说明下列指令是否正确，并指出错误原因。</strong></p>
<ol>
<li>MOV [2100],[2200H]，错误，MOV指令的两个操作数必须有一个为寄存器</li>
<li>MOV DH,0001H，错误，两个操作数的位数不一样</li>
<li>MOV CX,50H[BX+BP]，错误，不允许同时使用BX，BP</li>
<li>MOV IP,2456H，错误，IP不能作为目标操作数</li>
<li>PUSH DL，错误，DL为一个字节，不能进栈</li>
<li>MOV CS,AX，错误，CX只能向通用寄存器传，不能反转</li>
<li>MOV 3000H,BX，错误，立即数不能作为目标操作数</li>
<li>MOV ES,DS，错误，不允许在两个段寄存器之间传值</li>
<li>IN AX,256，错误，256不在00H~FFH范围之内</li>
</ol>

    </div>

    
    
    

    <footer class="post-footer">
          

<div class="post-copyright">
<ul>
  <li class="post-copyright-author">
      <strong>本文作者： </strong>Wyatex
  </li>
  <li class="post-copyright-link">
      <strong>本文链接：</strong>
      <a href="https://wyatex.online/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%BE%AE%E6%9C%BA%E4%B8%8E%E6%8E%A5%E5%8F%A3%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0%EF%BC%883%EF%BC%89/" title="微机与接口技术笔记（3）">https://wyatex.online/学习笔记/微机与接口技术笔记（3）/</a>
  </li>
  <li class="post-copyright-license">
      <strong>版权声明： </strong>本博客所有文章除特别声明外，均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh" rel="noopener" target="_blank"><i class="fab fa-fw fa-creative-commons"></i>BY-NC-SA</a> 许可协议。转载请注明出处！
  </li>
</ul>
</div>

          <div class="post-tags">
              <a href="/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/" rel="tag"># 学习笔记</a>
              <a href="/tags/%E5%BE%AE%E6%9C%BA/" rel="tag"># 微机</a>
          </div>

        

          <div class="post-nav">
            <div class="post-nav-item">
                <a href="/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%BE%AE%E6%9C%BA%E4%B8%8E%E6%8E%A5%E5%8F%A3%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0%EF%BC%882%EF%BC%89/" rel="prev" title="微机与接口技术笔记（2）">
                  <i class="fa fa-angle-left"></i> 微机与接口技术笔记（2）
                </a>
            </div>
            <div class="post-nav-item">
                <a href="/%E5%89%8D%E7%AB%AF/js%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%B1%BB/" rel="next" title="js笔记：类">
                  js笔记：类 <i class="fa fa-angle-right"></i>
                </a>
            </div>
          </div>
    </footer>
  </article>
</div>






</div>
  </main>

  <footer class="footer">
    <div class="footer-inner">

  <div class="copyright">
    &copy; 2019 – 
    <span itemprop="copyrightYear">2024</span>
    <span class="with-love">
      <i class="fa fa-heart"></i>
    </span>
    <span class="author" itemprop="copyrightHolder">Wyatex</span>
  </div>
<div class="busuanzi-count">
    <span class="post-meta-item" id="busuanzi_container_site_uv">
      <span class="post-meta-item-icon">
        <i class="fa fa-user"></i>
      </span>
      <span class="site-uv" title="总访客量">
        <span id="busuanzi_value_site_uv"></span>
      </span>
    </span>
    <span class="post-meta-item" id="busuanzi_container_site_pv">
      <span class="post-meta-item-icon">
        <i class="fa fa-eye"></i>
      </span>
      <span class="site-pv" title="总访问量">
        <span id="busuanzi_value_site_pv"></span>
      </span>
    </span>
</div>

    </div>
  </footer>

  
  <div class="back-to-top" role="button" aria-label="返回顶部">
    <i class="fa fa-arrow-up fa-lg"></i>
    <span>0%</span>
  </div>
  <div class="reading-progress-bar"></div>

<noscript>
  <div class="noscript-warning">Theme NexT works best with JavaScript enabled</div>
</noscript>


  
  <script size="300" alpha="0.6" zIndex="-1" src="/lib/ribbon.js/dist/ribbon.min.js"></script>
  <script src="/lib/animejs/lib/anime.min.js" integrity="sha256-XL2inqUJaslATFnHdJOi9GfQ60on8Wx1C2H8DYiN1xY=" crossorigin="anonymous"></script>
  <script src="/lib/@next-theme/pjax/pjax.min.js" integrity="sha256-vxLn1tSKWD4dqbMRyv940UYw4sXgMtYcK6reefzZrao=" crossorigin="anonymous"></script>
  <script src="/lib/@fancyapps/ui/dist/fancybox/fancybox.umd.js" integrity="sha256-q8XkJ6dj5VwSvzI8+nATCHHQG+Xv/dAZBCgqmu93zOY=" crossorigin="anonymous"></script>
  <script src="/lib/lozad/dist/lozad.min.js" integrity="sha256-mOFREFhqmHeQbXpK2lp4nA3qooVgACfh88fpJftLBbc=" crossorigin="anonymous"></script>
<script src="/js/comments.js"></script><script src="/js/utils.js"></script><script src="/js/motion.js"></script><script src="/js/next-boot.js"></script><script src="/js/pjax.js"></script>

  <script src="/lib/hexo-generator-searchdb/dist/search.js" integrity="sha256-1kfA5uHPf65M5cphT2dvymhkuyHPQp5A53EGZOnOLmc=" crossorigin="anonymous"></script>
<script src="/js/third-party/search/local-search.js"></script>




  <script src="/js/third-party/fancybox.js"></script>



  
  <script data-pjax async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>





</body>
</html>
